AWS Organizations のRoot access management を使ってすべてのアクセスを拒否したS3 バケットを復旧させてみた

AWS Organizations のRoot access management を使ってすべてのアクセスを拒否したS3 バケットを復旧させてみた

Clock Icon2024.11.18

あしざわです。

先日、AWS Organizations にRoot access management という新しい機能が追加されたのはご存じでしょうか。

https://dev.classmethod.jp/articles/root-access-management/

Root access management によって、ルートユーザーでしかできないタスクをOrganizations の管理アカウントから実行できるようになりました。

現時点で実行できるタスクは以下の4つです。

  1. メンバーアカウントのルートユーザー資格情報を削除・復旧する
  2. メンバーアカウントのIAM ユーザーの権限を復旧する
  3. すべてのプリンシパルのアクセスを拒否するバケットポリシーを削除する
  4. すべてのプリンシパルによるAmazon SQS キューへのアクセスを拒否するリソースベースポリシーを削除する

今回は3つ目のS3 バケットポリシーの削除を試してみたいと思います。

実施前の諸注意

今回の検証は一定のリスクがある操作を行うため、自身の環境で同様の操作を行う場合以下の点に注意してください。

  • システム稼働中のAWS アカウントにある既存のS3 バケットのアクセス権限を削除実施してしまうと、何らかのシステム影響がある可能性があります。必ず検証用AWS アカウントや新規のS3 バケットで実施するようにしてください。
  • Organizations の管理アカウントの権限が利用できない状態でS3 バケットのアクセス権限を削除すると、設定の切り戻しがルートユーザーでしか行えません。自身が利用できるAWS アカウントの権限を事前に確認しておいてください。

やってみた

今回の検証は以下の前提で進めています。

  • Administrators 相当の権限があるIAM 認証情報を利用してAWS Organizations の管理アカウント および メンバーアカウントを操作できること

事前に、Organizations 管理アカウントのIAM > Root access management から メンバーアカウントでの特権ルートアクション を有効化します。

CleanShot 2024-11-17 at 13.33.56.png

CleanShot 2024-11-17 at 13.37.13.png

続いて、メンバーアカウントで新規のS3バケットを作成します。

すべてのアクセスを拒否するようにS3 バケットポリシーを構成します。

{
	"Version": "2012-10-17",
	"Statement": [
		{
            "Action": "*",
            "Effect": "Deny",
            "Resource": [
                "arn:aws:s3:::all-deny-bucket-<AWSアカウントID>",
                "arn:aws:s3:::all-deny-bucket-<AWSアカウントID>/*"
            ],
            "Principal": "*"
        }
	]
}

設定を保存すると、バケットポリシーを含めすべてのS3設定を確認できなくなります。これですべてのアクセスを拒否したS3 バケットの設定が完了しました。

CleanShot 2024-11-17 at 14.20.40.png

・エラー文
User: arn:aws:sts::123456789012:assumed-role/xxxxxxx is not authorized to perform: s3:GetBucketVersioning on resource: "arn:aws:s3:::all-deny-bucket-123456789012" with an explicit deny in a resource-based policy

Organizations の管理アカウントに再度ログインします。

IAM > Root access management からすべてのアクセスを拒否したS3 バケットがあるAWS アカウントを指定して、特権的なアクションを実行する を選択します。

CleanShot 2024-11-17 at 14.25.02.png

Privileged action でDelete S3 bucket policy を選択し、S3 URI に先ほど作成したS3バケットを指定します。

CleanShot 2024-11-17 at 14.29.55.png

Delete bucket policy をクリックすると削除確認画面が表示されます。Bucket policy トグル内に削除対象のバケットポリシーが確認できますね。

CleanShot 2024-11-18 at 00.07.59.png

確認画面で一時的に Network Failure と表示され確認できないタイミングがありました。しばらく時間が経った後はエラーが出なくなったので同じ事象に遭遇した方は待ってみるのも手です。
CleanShot 2024-11-17 at 14.35.49.png

内容を確認してから、必要事項を入力し削除します。

Bucket policy on S3 bucket all-deny-bucket-<AWSアカウントID>> deleted. と表示され、成功したようです。

メンバーアカウントに切り替えて対象のS3 バケットを確認すると、デフォルト状態のバケットポリシーが表示されていました。すべてのアクセスを拒否したバケットポリシーが削除できたことがわかります。

CleanShot 2024-11-18 at 00.28.09.png

最後に

今回はAWS Organizations で登場したRoot access management を使ったS3 バケットポリシーの強制削除を試してみました。

Root access management を使うとルートユーザー限定のタスクを通常のIAM ユーザー/ロールでも実施できます。

ただ、この機能の登場によってOrganizations 管理アカウントのIAMユーザーがルート相当の権限昇格の危険性を持つことになります。今後より一層Organizations 管理アカウントのアクセス制限の重要性が問われていきます。

以上です。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.